// 模板模式

package template

import "fmt"

// 定义接口
type Product interface {
	Use()
	Print()
}

// 定义模板继承
type ProductTemplate struct {
	Name string
	Product
}

// 定义产品A，继承模板
type ProductA struct {
	ProductTemplate
}

// 定义产品B，继承模板
type ProductB struct {
	ProductTemplate
}

// 模板实现公共接口
func (p *ProductTemplate) Print() {
	fmt.Println("name", p.Name)
}

func (p *ProductA) Use() {
	fmt.Println("ProductA use")
}

func (p *ProductB) Use() {
	fmt.Println("ProductB use")
}

func main() {
	p := ProductA{
		ProductTemplate: ProductTemplate{
			Name: "ProductA",
		},
	}
	p.Use()
	p.Print()
	p1 := ProductB{
		ProductTemplate: ProductTemplate{
			Name: "ProductB",
		}}
	p1.Use()
	p1.Print()
}
